package com.answer.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

/**
 * JSON序列化配置
 */
@JsonComponent
public class JsonConfig {

    /**
     * 配置并返回一个Jackson ObjectMapper实例
     * 该方法通过定制化配置，增强了对象与JSON字符串之间的转换能力
     * 特别地，它解决了Long类型到JSON的序列化问题，确保了数据的准确性
     *
     * @param builder Jackson2ObjectMapperBuilder实例，用于构建ObjectMapper
     * @return 配置好的ObjectMapper实例
     */
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        // 创建一个ObjectMapper实例，用于后续的定制化配置
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();

        // 创建一个SimpleModule实例，用于注册自定义的序列化器和反序列化器
        SimpleModule module = new SimpleModule();

        // 为Long类型及其包装类注册ToStringSerializer，以优化JSON序列化过程
        // 这主要是为了解决Long类型在某些情况下可能因数值过大而导致的精度丢失问题
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);

        // 将自定义的序列化器和反序列化器模块注册到ObjectMapper实例中
        objectMapper.registerModule(module);

        // 返回配置好的ObjectMapper实例
        return objectMapper;
    }
}
